struct Solution;

impl Solution {
    // pub fn spiral_matrix_iii_self(r: i32, c: i32, r0: i32, c0: i32) -> Vec<Vec<i32>> {
    //     let mut result = vec![];
    //
    //     // 0 右 1 下 2 左 3 上
    //     let mut dir = 0;
    //
    //     let mut r_top = r0;
    //     let mut r_down = r0;
    //     let mut c_left = c0;
    //     let mut c_right = c0;
    //
    //     let mut cur_r = r0;
    //     let mut cur_c = c0;
    //
    //     let max = r * c;
    //     result.push(vec![r0, c0]);
    //     // println!("初始化 c_right {} c_left {} r_top {} r_down {}", c_right, c_left, r_top, r_down);
    //     while result.len() < max as usize {
    //         // println!("len {} dir {} ", result.len(), dir);
    //         // println!("c_right {} c_left {} r_top {} r_down {}", c_right, c_left, r_top, r_down);
    //         // 填充值
    //         match dir {
    //             0 => {
    //                 c_right += 1;
    //                 if cur_r >= 0 && cur_r < r {
    //                     let left = i32::max(0, c_left + 1);
    //                     let right = i32::min(c_right, c - 1);
    //                     // println!("right [{},{}..{}]", cur_r, left, right);
    //                     for i in left..=right {
    //                         result.push(vec![cur_r, i]);
    //                     }
    //                 }
    //                 cur_c = c_right;
    //                 dir = 1;
    //             }
    //             // 往下移动
    //             1 => {
    //                 r_down += 1;
    //                 if cur_c >= 0 && cur_c < c {
    //                     let top = i32::max(0, r_top + 1);
    //                     let down = i32::min(r_down, r - 1);
    //                     // println!("down [{}..{},{}]", top, down, cur_c);
    //                     for i in top..=down {
    //                         result.push(vec![i, cur_c]);
    //                     }
    //                 }
    //                 cur_r = r_down;
    //                 dir = 2;
    //             }
    //             // 向左移动
    //             2 => {
    //                 c_left -= 1;
    //                 if cur_r >= 0 && cur_r < r {
    //                     let left = i32::max(0, c_left);
    //                     let right = i32::min(c_right - 1, c - 1);
    //                     // println!("left [{},{}..{}]", cur_r, right, left);
    //                     for i in (left..=right).rev() {
    //                         result.push(vec![cur_r, i]);
    //                     }
    //                 }
    //                 cur_c = c_left;
    //                 dir = 3;
    //             }
    //             // 向上移动
    //             3 => {
    //                 r_top -= 1;
    //                 if cur_c >= 0 && cur_c < c {
    //                     let top = i32::max(0, r_top);
    //                     let down = i32::min(r_down - 1, r - 1);
    //                     // println!("top [{}..{},{}]", down, top, cur_c);
    //                     for i in (top..=down).rev() {
    //                         result.push(vec![i, cur_c]);
    //                     }
    //                 }
    //                 cur_r = r_top;
    //                 dir = 0;
    //             }
    //             _ => {
    //                 // 错误
    //                 return result;
    //             }
    //         }
    //     }
    //
    //     result
    // }


    pub fn spiral_matrix_iii(r: i32, c: i32, r0: i32, c0: i32) -> Vec<Vec<i32>> {
        // 根据1 1 2 2 ... 确定步数 重复2次，很容易得到n/2+1 n为序号


        let (mut x, mut y) = (r0, c0);

        let (mut dx, mut dy) = (0, 1);

        let mut tmp;

        let mut index = 0;

        let mut result = vec![];

        let max = (r * c) as usize;

        while result.len() < max {
            for _ in 0..=(index / 2) {
                if x >= 0 && x < r && y >= 0 && y < c {
                    result.push(vec![x, y]);
                }
                x += dx;
                y += dy;
            }

            index += 1;

            tmp = dx;
            dx = dy;
            dy = -tmp;
        }
        result
    }
}


#[test]
fn test() {
    // let res = Solution::spiral_matrix_iii(5, 6, 1, 4);
}

fn main() {
    Solution::spiral_matrix_iii(5, 6, 1, 4);
}
